#ifndef __CTIMERMGR_H__
#define __CTIMERMGR_H__
/**
 * @file TimerMgr.h
 * @author Lost
 * @date 2020/04/19
 * @brief 定时器管理类
 * 
 */
#include "Log.h"
#include "Singleton.h"

/**
 * @brief 定时器类型
 * @note 
 */
enum EnmTimer
{
    /*!< 错误类型 */
    ENM_TIMER_ERROR,

    /*!< 每毫秒定时器 */
    ENM_TIMER_PRE_MILLI_SECOND,

    /*!< 每秒定时器 */
    ENM_TIMER_PRE_SECOND,

    /*!< 定点定时器 */
    ENM_TIMER_FIX_DAY_TIME,

    /*!< 一次性定时器 */
    ENM_TIMER_ONCE,
};

/**
 * @brief 定时器
 * @note 
 */
class CTimer
{
public:
    CTimer(char *pcsName, int iParam = 0);
    virtual ~CTimer();

public:
    /**
     * @brief 处理函数
     * @note 
     */
    virtual int Proc();

    /**
     * @brief 获取类型
     * @note 
     */
    virtual int GetType() = 0;

    /**
     * @brief 生成下次触发时间
     * @note 
     */
    virtual int64_t GenerateNextTriggerTimeStamp() = 0;
public:
    /**
     * @brief 获取创建时间戳
     * @note 
     */
    inline int64_t GetCreateTimeStamp() { return m_llCreateTimeStamp; }

    /**
     * @brief 设置创建时间戳
     * @note
     */
    inline void SetCreateTimeStamp(int64_t llCreateTimeStamp) { m_llCreateTimeStamp = llCreateTimeStamp; }

    /**
     * @brief 获取下次触发时间戳
     * @note
     */
    inline int64_t GetNextTriggerTimeStamp() { return m_llNextTriggerTimeStamp; }

    /**
     * @brief 设置下次触发时间戳
     * @note 单位秒, 当类型为ENM_TIMER_PRE_MILLI_SECOND,单位毫秒
     */
    inline void SetNextTriggerTimeStamp(int64_t llNextTriggerTimeStamp) { m_llNextTriggerTimeStamp = llNextTriggerTimeStamp; }
    /**
     * @brief 获取参数
     * @note
     */
    inline int GetParam() { return m_iParam; }

    /**
     * @brief 设置参数
     * @note
     */
    inline void SetParam(int iParam) { m_iParam = iParam; }   
    
    /**
     * @brief 获取删除标记
     * @note
     */
    inline int GetDelFlag() { return m_bDelFlag; }

    /**
     * @brief 设置删除标记
     * @note
     */
    inline void SetDelFlag(bool  bDelFlag) { m_bDelFlag = bDelFlag; }

    /**
     * @brief 获取名字
     * @note
     */
    inline string &GetName() { return m_stName; }

    /**
     * @brief 设置名字
     * @note
     */
    inline void SetName(string &stName) { m_stName = stName; }
private:
    /*!< 创建时间戳 */
    int64_t m_llCreateTimeStamp;

    /*!< 下次触发时间戳 单位秒, 当类型为ENM_TIMER_PRE_MILLI_SECOND,单位毫秒*/
    int64_t m_llNextTriggerTimeStamp;

    /*!< 定时器类型 */
    EnmTimer m_eType;

    /*!< 参数 */
    int m_iParam;

    /*!< 删除标记 */
    bool m_bDelFlag;

    /*!< 名字 */
    string m_stName;
};

/**
 * @brief 毫秒级定时器
 * @note 参数Param为毫秒;
 */
class CTimerPreMilliSecond : public CTimer
{
public:

    /**
     * @brief 获取类型
     * @note
     */
    inline virtual int GetType() { return ENM_TIMER_PRE_MILLI_SECOND; }

    /**
     * @brief 生成下次触发时间
     * @note
     */
    virtual int64_t GenerateNextTriggerTimeStamp();
private:

};

/**
 * @brief 秒级定时器
 * @note 参数Param为秒;
 */
class CTimerPreSecond : public CTimer
{
public:

    /**
     * @brief 获取类型
     * @note
     */
    inline virtual int GetType() { return ENM_TIMER_PRE_SECOND; }

    /**
     * @brief 生成下次触发时间
     * @note
     */
    virtual int64_t GenerateNextTriggerTimeStamp();
private:

};

/**
 * @brief 每天固定时间定时器
 * @note 参数Param为每天时间;
 */
class CTimerFixDayTime : public CTimer
{
public:
    /**
     * @brief 获取类型
     * @note
     */
    inline virtual int GetType() { return ENM_TIMER_FIX_DAY_TIME; }

    /**
     * @brief 生成下次触发时间
     * @note Param:从凌晨开始计算,每天中第Param秒触发
     */
    virtual int64_t GenerateNextTriggerTimeStamp();
};

/**
 * @brief 一次性时间戳定时器
 * @note 参数Param为时间戳;
 */
class CTimerOnce : public CTimer
{
public:
    /**
     * @brief 获取类型
     * @note
     */
    inline virtual int GetType() { return ENM_TIMER_ONCE; }

    /**
     * @brief 生成下次触发时间
     * @note Param:从凌晨开始计算,每天中第Param秒触发
     */
    virtual int64_t GenerateNextTriggerTimeStamp();
};

/**
 * @brief 定时器
 * @note 处理各种和时间相关内容
 */
class CTimerMgr : public CSingleton<CTimerMgr>
{
public:
    CTimerMgr();
    ~CTimerMgr();
public:
    bool Init();
    int Proc();

    int AddTimer( CTimer *pTimer);
    void Remove( CTimer *pTimer );
private:
    typedef vector<CTimer*> TimerVec;
    /*!< 毫秒定时器池 */
    TimerVec m_vecMilliSecondTimer;

    /*!< 秒定时器池 */
    TimerVec m_vecSecondTimer;
};


#endif //__CTIMERMGR_H__